create database TT;
go
use TT;
create table stuinfo(
stuNO nvarchar(10) unique,
stuName nvarchar(10),
stuAge int,
stuAddress nvarchar(10),
stuSeat int,
stuSex tinyint,
);
insert into stuinfo(stuNO,stuName,stuAge,stuAddress,stuSeat,stuSex) 
values ('s2501','张秋利',20,'美国硅谷',1,1),('s2502','李斯文',18,'湖北武汉',2,0),
('s2503','马文才',22,'湖南长沙',3,1),('s2504','欧阳俊雄',21,'湖北武汉',4,0),
('s2505','梅超分',20,'湖北武汉',5,1),('s2506','陈旋风',19,'美国硅谷',6,1),
('s2507','陈旋风',20,'美国硅谷',7,0);
create table stuexam(
examNO int identity,
stuNO nvarchar(10),
writtenExam int,
labExam int ,
);
insert into stuexam(stuNO,writtenExam,labExam) 
values('s2501',50,70),('s2502',60,65),('s2503',86,85),('s2504',40,80),('s2505',70,90),
('s2506',85,90);
--查询学生信息表（stuinfo）中所有列信息，给每列取上中文名称
select stuNO as 学号,stuName as 名字,stuAge as 年龄,stuAddress as 地址,stuSeat as 座号,stuSex as 性别 from stuinfo;
--查询学生信息表（stuinfo）中的姓名，年龄和地址三列的信息
select stuName as 名字,stuAge as 年龄,stuAddress as 地址 from stuinfo;
--查询学生分数表（stuexam）中的学号，笔试和机试三列的信息，并为这三列取中文名字-注意：要用三种方法
select stuNO as 学号,writtenExam as 笔试,labExam as 机试 from stuexam;
select stuNO 学号,writtenExam 笔试,labExam 机试 from stuexam;
select 学号=stuNO,笔试=writtenExam,机试=labExam from stuexam;
--查询学生信息表（stuInfo）中的学号，姓名，地址，以及将：姓名+@+地址 组成新列 “邮箱”
select stuNO as 学号,stuName as 名字,stuAddress as 地址,cast(stuName+'@'+stuAddress as varchar(40)) as 邮箱 from stuinfo;
--查询学生分数表（stuexam）中的学生的学号，笔试，机试以及总分这四列的信息
select stuNO as 学号,writtenExam as 笔试,labExam as 机试,cast(writtenExam+labExam as int)as 总分 from stuexam;
--查询学生信息表（stuInfo）中学生来自哪几个地方 
select distinct stuAddress from stuinfo;
--查询学生信息表（stuInfo）中学生有哪几种年龄，并为该列取对应的中文列名
select distinct stuage as 哪几种年龄 from stuinfo;
--查询学生信息表（stuInfo）中前3行记录
select top 3 * from stuinfo;
--查询学生信息表（stuInfo）中前4个学生的姓名和座位号
select top 4 stuName as 姓名,stuseat as 座号 from stuinfo;
--查询学生信息表（stuInfo）中一半学生的信息
select top 50percent * from stuinfo;
--将地址是湖北武汉，年龄是20的学生的所有信息查询出来
select * from stuinfo where stuAddress='湖北武汉' and stuAge=20;
--将机试成绩在60-80之间的信息查询出来，并按照机试成绩降序排列（用两种方法实现）
select * from stuexam where labExam between 60 and 80 order by labExam desc;
select * from stuexam where labExam >= 60 and labExam<=80 order by labExam desc;
--查询来自湖北武汉或者湖南长沙的学生的所有信息（用两种方法实现）
select * from stuinfo where stuAddress='湖北武汉' or stuAddress='湖南长沙';
select * from stuinfo where stuAddress in ('湖北武汉','湖南长沙');
--查询出笔试成绩不在70-90之间的信息,并按照笔试成绩升序排列（用两种方法实现）
select * from stuexam where writtenExam<=70 or writtenExam>=90 order by writtenExam asc;
select * from stuexam where writtenExam not between 71 and 89 order by writtenExam asc;
--查询年龄没有写的学生所有信息
select * from stuinfo where stuAge is null; 
--查询年龄写了的学生所有信息
select * from stuinfo where stuAge is not null; 
--查询姓张的学生信息
select * from stuinfo where stuName like '张__';
--查询学生地址中有‘湖’字的信息
select * from stuinfo where stuAddress like '%湖%';
--查询姓张但名为一个字的学生信息
select * from stuinfo where stuName like '张&';
--查询姓名中第三个字为‘俊’的学生的信息，‘俊’后面有多少个字不限制
select * from stuinfo where stuName like '%__俊%';
--按学生的年龄降序显示所有学生信息
select * from stuinfo order by stuAge desc;
--按学生的年龄降序和座位号升序来显示所有学生的信息
select * from stuinfo order by stuAge desc,stuSeat asc;
--显示笔试第一名的学生的考试号，学号，笔试成绩和机试成绩
select stuNo,examNO,writtenExam,labExam from stuexam where writtenExam in(select max(writtenExam) from stuexam);
select top 1 * from stuexam order by writtenExam desc;
--显示机试倒数第一名的学生的考试号，学号，笔试成绩和机试成绩
select stuNo,examNO,writtenExam,labExam from stuexam where labExam in(select min(labExam) from stuexam)
select top 1 * from stuexam order by labExam asc;
--查询每个地方的学生的平均年龄
select stuAddress, avg(stuAge) as 平均年龄 from stuinfo group by stuAddress;
--查询男女生的分别的年龄总和
select stuSex,sum(stuAge) as 年龄总和 from stuinfo group by stuSex;
--查询每个地方的男女生的平均年龄和年龄的总和
select stuAddress,stuSex,avg(stuAge) as 平均年龄,sum(stuAge) as 年龄总和 from stuinfo group by stuAddress,stuSex;
--1.查询学生的姓名，年龄，笔试成绩和机试成绩
select stuName,StuAge,writtenExam,labExam from stuinfo join stuexam on stuinfo.stuNO=stuexam.stuNO;
--2.查询笔试和机试成绩都在60分以上的学生的学号，姓名，笔试成绩和机试成绩
select stuinfo.stuNO,stuName,writtenExam,labExam from stuinfo join stuexam on stuinfo.stuNO=stuexam.stuNO  where writtenExam>60 and labExam>60;
--3.查询所有学生的学号，姓名，笔试成绩，机试成绩，没有参加考试的学生的成绩以NULL值填充
select stuinfo.stuNO 学号,stuName 姓名,writtenExam 笔试成绩,labExam 机试成绩 from stuinfo left join stuexam on stuinfo.stuNO=stuexam.stuNO
--4.查询年龄在20以上（包括20）的学生的姓名，年龄，笔试成绩和机试成绩，并按笔试成绩降序排列
select stuinfo.stuNO 学号,stuName 名字,writtenExam 笔试,labExam 机试 from stuinfo left join stuexam on stuinfo.stuNO=stuexam.stuNO where stuAge>=20 order by labExam desc
--5.查询男女生的机试平均分
select stuSex 性别,avg(labExam) 平均分 from stuinfo join stuexam on stuinfo.stuNO=stuexam.stuNO group by stuSex;
--6.查询男女生的笔试总分
select stuSex 性别,sum(labExam)总分 from stuinfo join stuexam on stuinfo.stuNO=stuexam.stuNO group by stuSex;